<?php

/**
 * Description of TCriteriaclass
 *
 * @author Saulo
 */
class TCriteria extends TExpression {
    //put your code here
    private $expressions;
    private $operators;
    private $properties;

    /*Método add()
     * adiciona uma expressão ao critério
     * @param $expression = Expressão (objeto TExpression)
     * @param $operator = operador lógico de comparação
     */

    public function add(TExpression $expression, $operator = self::AND_OPERATOR )
    {
        //na primeira vez não precisa de operador lógico para concatenar
        if(empty ($this->expressions))
        {
            unset($operator);
        }
        //agrega o resultado da epressão alista de expressão
        $this->expressions[] = $expression;
        $this->operators[] = $operator;
    }

    /*
     * Retorna a expressão final
     */
    public function dump()
    {
        if( is_array($this->expressions))
        {
            foreach ($this->expressions as $i => $expression)
            {
                   $operator = $this->operators[$i];
                   $result .= $operator. $expression->dump().' ';
            }
            $result = trim($result);
            return "({$result})";
        }else{
            throw new Exception("Se o que você deseja é apenas um Filtro então use um TFilter e não um TCriteria");
        }
    }
    /*
     * método setProperty()
     * @param $property = propriedade
     * @param $value = Valor
     */
    public function setProperty($property, $value)
    {
        if(!empty ($property) && !empty ($value)){
        $this->properties[$property] = $value;
        }else{
          throw new Exception("Não foi especificado um valor ou nome de propriedade!");
        }
    }
    /*
     * Método getProperty()
     * retorna o valor da propriedade especificada no parâmetro
     * @param $property = propriedade
     */
    public function getProperty($property)
    {
        return $this->properties[$property];
    }

}
?>
